#include <REGX52.H>
#include <INTRINS.H>

sbit ONEWIRE_DQ = P3^7;

/** @bref 延迟500us函数
  * @param 无
  * @retval 无
  */
void delay500us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 227;
	while (--i);
}

/** @bref 延迟70us函数
  * @param 无
  * @retval 无
  */
void delay70us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 29;
	while (--i);
}

/** @bref 延迟10us函数
  * @param 无
  * @retval 无
  */
void delay10us()		//@11.0592MHz
{
	unsigned char i;

	i = 2;
	while (--i);
}

/** @bref 延迟50us函数
  * @param 无
  * @retval 无
  */
void delay50us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 20;
	while (--i);
}

/** @bref 延迟5us函数
  * @param 无
  * @retval 无
  */
void delay5us()		//@11.0592MHz
{
	
}

/** @bref 单总线初始化
  * @param 无
	* @retval 从机响应位，0是响应，1是未响应
  */
unsigned char OneWire_init()
{
	unsigned char ack;
	
	ONEWIRE_DQ = 1;
	ONEWIRE_DQ = 0;
	delay500us();
	ONEWIRE_DQ = 1;
	delay70us();
	ack = ONEWIRE_DQ;
	delay500us();
	
	return ack;
}

/** @bref 单总线发送一位
  * @param 要发送的一位数据
  * @retval 无
  */
void OneWire_sendBit(unsigned char Bit)
{
	ONEWIRE_DQ = 0;
	delay10us();
	ONEWIRE_DQ = Bit;
	delay50us();
	ONEWIRE_DQ = 1;	
}

/** @bref 单总线接收一位
  * @param 无
  * @retval 接收到的一位数据
  */
unsigned char OneWire_recevieBit()
{
	unsigned char Bit;
	
	ONEWIRE_DQ = 0;
	delay5us();
	ONEWIRE_DQ = 1;
	delay5us();
	Bit = ONEWIRE_DQ;
	delay50us();
	
	return Bit;
}

/** @bref 单总线发送一个字节
  * @param 要发送的字节数据
  * @retval 无
  */
void OneWire_sendByte(unsigned char byte)
{
	unsigned char i = 0;
	for(i = 0; i < 8; i++)
	{
		OneWire_sendBit(byte & (0x01 << i));
	}
}

/** @bref 单总线接收一个字节
  * @param 无
  * @retval 要接收的字节数据
  */
unsigned char OneWire_receiveByte()
{
	unsigned char i = 0;
	unsigned char byte = 0x00;
	for(i = 0; i < 8; i++)
	{
		if(OneWire_recevieBit())
		{
			byte |= 0x01 << i;
		}
	}
	
	return byte;
}
